" ==============================================================================
" Vim syntax file
" Language:        C++ (extended for C++11/14/17/20)
" Original Author: Jon Haggblad <https://github.com/octol>
" Maintainer:      bfrg <bfrg@users.noreply.github.com>
" Website:         https://github.com/bfrg/vim-cpp-modern
" Last Change:     Feb 19, 2019
"
" Extended syntax highlighting for C++ (including C++11/14/17/20)
"
" Compared to Vim's default C++ syntax highlighting, this syntax file adds
" highlighting of functions, containers and types in the standard library.
" Optionally, library concepts (like CopyConstructible) can be highlighted as
" standard library types.
"
" This syntax file is based on the previous work by Jon Haggblad:
"   https://github.com/octol/vim-cpp-enhanced-highlight
"
" Difference to vim-cpp-enhanced-highlight:
"
" - Standard library functions have been commented out because words followed by
"   an opening parenthesis are highlighted as functions anyway, so we don't have
"   to explicitly list each library function in here. The only exceptions are
"   standard library function templates, which sometimes must be called with
"   template parameters, like std::make_unique<Foo>(bar).
"
" - Another reason why almost all functions have been commented out is because
"   if someone had defined his/her own type and the name collides with a library
"   function name, this user-defined type would have been highlighted as a
"   function.
"
" - User-defined function templates or class members won't be highlighted.
"   This feature was removed because it was too slow and buggy.
"
" - C++ keywords inline, virtual, explicit, export, override and final are moved
"   to the syntax group StorageClass.
" ==============================================================================


" Standard library types and functions {{{1
" Based on the syntax vim script by Mizuchi <ytj000@gmail.com>
" http://www.vim.org/scripts/script.php?script_id=4293

syntax keyword cppSTLconstant MB_CUR_MAX
syntax keyword cppSTLconstant MB_LEN_MAX
syntax keyword cppSTLconstant WCHAR_MAX
syntax keyword cppSTLconstant WCHAR_MIN
syntax keyword cppSTLconstant WEOF
syntax keyword cppSTLconstant __STDC_UTF_16__
syntax keyword cppSTLconstant __STDC_UTF_32__
syntax keyword cppSTLconstant badbit
syntax keyword cppSTLVariable cerr
syntax keyword cppSTLVariable cin
syntax keyword cppSTLVariable clog
syntax keyword cppSTLVariable cout
syntax keyword cppSTLconstant digits
syntax keyword cppSTLconstant digits10
syntax keyword cppSTLconstant eofbit
syntax keyword cppSTLconstant failbit
syntax keyword cppSTLconstant goodbit
syntax keyword cppSTLconstant has_denorm
syntax keyword cppSTLconstant has_denorm_loss
syntax keyword cppSTLconstant has_infinity
syntax keyword cppSTLconstant has_quiet_NaN
syntax keyword cppSTLconstant has_signaling_NaN
syntax keyword cppSTLconstant is_bounded
syntax keyword cppSTLconstant is_exact
syntax keyword cppSTLconstant is_iec559
syntax keyword cppSTLconstant is_integer
syntax keyword cppSTLconstant is_modulo
syntax keyword cppSTLconstant is_signed
syntax keyword cppSTLconstant is_specialized
syntax keyword cppSTLconstant max_exponent
syntax keyword cppSTLconstant max_exponent10
syntax keyword cppSTLconstant min_exponent
syntax keyword cppSTLconstant min_exponent10
syntax keyword cppSTLconstant nothrow
syntax keyword cppSTLconstant npos
syntax keyword cppSTLconstant radix
syntax keyword cppSTLconstant round_style
syntax keyword cppSTLconstant tinyness_before
syntax keyword cppSTLconstant traps
syntax keyword cppSTLVariable wcerr
syntax keyword cppSTLVariable wcin
syntax keyword cppSTLVariable wclog
syntax keyword cppSTLVariable wcout

syntax keyword cppSTLexception bad_alloc
syntax keyword cppSTLexception bad_exception
syntax keyword cppSTLexception bad_typeid bad_cast
syntax keyword cppSTLexception domain_error
syntax keyword cppSTLexception exception
syntax keyword cppSTLexception invalid_argument
syntax keyword cppSTLexception length_error
syntax keyword cppSTLexception logic_error
syntax keyword cppSTLexception out_of_range
syntax keyword cppSTLexception overflow_error
syntax keyword cppSTLexception range_error
syntax keyword cppSTLexception runtime_error
syntax keyword cppSTLexception underflow_error
syntax keyword cppSTLexception failure

syntax keyword cppSTLfunctional binary_function
syntax keyword cppSTLfunctional binary_negate
syntax keyword cppSTLfunctional bit_and
syntax keyword cppSTLfunctional bit_not
syntax keyword cppSTLfunctional bit_or
syntax keyword cppSTLfunctional divides
syntax keyword cppSTLfunctional equal_to
syntax keyword cppSTLfunctional greater
syntax keyword cppSTLfunctional greater_equal
syntax keyword cppSTLfunctional less
syntax keyword cppSTLfunctional less_equal
syntax keyword cppSTLfunctional logical_and
syntax keyword cppSTLfunctional logical_not
syntax keyword cppSTLfunctional logical_or
syntax keyword cppSTLfunctional minus
syntax keyword cppSTLfunctional modulus
syntax keyword cppSTLfunctional multiplies
syntax keyword cppSTLfunctional negate
syntax keyword cppSTLfunctional not_equal_to
syntax keyword cppSTLfunctional plus
syntax keyword cppSTLfunctional unary_function
syntax keyword cppSTLfunctional unary_negate

syntax keyword cppSTLios resetiosflags
syntax keyword cppSTLios setiosflags
syntax keyword cppSTLios setbase
syntax keyword cppSTLios setfill
syntax keyword cppSTLios setprecision
syntax keyword cppSTLios setw
syntax keyword cppSTLios endl
syntax keyword cppSTLios ends
syntax keyword cppSTLios flush
" syntax keyword cppSTLios ws

syntax keyword cppSTLios boolalpha noboolalpha
syntax keyword cppSTLios showbase noshowbase
syntax keyword cppSTLios showpoint noshowpoint
syntax keyword cppSTLios showpos noshowpos
syntax keyword cppSTLios skipws noskipws
syntax keyword cppSTLios uppercase nouppercase
syntax keyword cppSTLios unitbuf nounitbuf
syntax keyword cppSTLios internal left right
syntax keyword cppSTLios dec hex oct
syntax keyword cppSTLios fixed scientific hexfloat defaultfloat

syntax keyword cppSTLtype fmtflags
syntax keyword cppSTLtype iostate
syntax keyword cppSTLtype openmode

" syntax keyword cppSTLconstant dec oct hex basefield
" syntax keyword cppSTLconstant left right internal adjustfield
" syntax keyword cppSTLconstant scientific fixed floatfield
" syntax keyword cppSTLconstant boolalpha
" syntax keyword cppSTLconstant showbase showpoint showpos
" syntax keyword cppSTLconstant skipws
" syntax keyword cppSTLconstant unitbuf
" syntax keyword cppSTLconstant uppercase
" syntax keyword cppSTLconstant app binary in out trunc ate

syntax keyword cppSTLiterator back_insert_iterator
syntax keyword cppSTLiterator bidirectional_iterator
syntax keyword cppSTLiterator const_iterator
syntax keyword cppSTLiterator const_reverse_iterator
syntax keyword cppSTLiterator forward_iterator
syntax keyword cppSTLiterator front_insert_iterator
syntax keyword cppSTLiterator input_iterator
syntax keyword cppSTLiterator insert_iterator
syntax keyword cppSTLiterator istream_iterator
syntax keyword cppSTLiterator istreambuf_iterator
syntax keyword cppSTLiterator ostreambuf_iterator
syntax keyword cppSTLiterator iterator
syntax keyword cppSTLiterator ostream_iterator
syntax keyword cppSTLiterator output_iterator
syntax keyword cppSTLiterator random_access_iterator
syntax keyword cppSTLiterator raw_storage_iterator
syntax keyword cppSTLiterator reverse_bidirectional_iterator
syntax keyword cppSTLiterator reverse_iterator

syntax keyword cppSTLiterator_tag bidirectional_iterator_tag
syntax keyword cppSTLiterator_tag forward_iterator_tag
syntax keyword cppSTLiterator_tag input_iterator_tag
syntax keyword cppSTLiterator_tag output_iterator_tag
syntax keyword cppSTLiterator_tag random_access_iterator_tag

syntax keyword cppSTLnamespace rel_ops
syntax keyword cppSTLnamespace std
syntax keyword cppSTLnamespace experimental

syntax keyword cppSTLtype Init
syntax keyword cppSTLtype event_callback
syntax keyword cppSTLtype allocator
syntax keyword cppSTLtype auto_ptr
syntax keyword cppSTLtype basic_filebuf
syntax keyword cppSTLtype basic_fstream
syntax keyword cppSTLtype basic_ifstream
syntax keyword cppSTLtype basic_iostream
syntax keyword cppSTLtype basic_istream
syntax keyword cppSTLtype basic_istringstream
syntax keyword cppSTLtype basic_ofstream
syntax keyword cppSTLtype basic_ostream
syntax keyword cppSTLtype basic_ostringstream
syntax keyword cppSTLtype basic_streambuf
syntax keyword cppSTLtype basic_string
syntax keyword cppSTLtype basic_stringbuf
syntax keyword cppSTLtype basic_stringstream
syntax keyword cppSTLtype binary_compose
syntax keyword cppSTLtype binder1st
syntax keyword cppSTLtype binder2nd
syntax keyword cppSTLtype bitset
syntax keyword cppSTLtype char_traits
syntax keyword cppSTLtype char_type
syntax keyword cppSTLtype pos_type
syntax keyword cppSTLtype off_type
syntax keyword cppSTLtype state_type
syntax keyword cppSTLtype const_mem_fun1_t
syntax keyword cppSTLtype const_mem_fun_ref1_t
syntax keyword cppSTLtype const_mem_fun_ref_t
syntax keyword cppSTLtype const_mem_fun_t
syntax keyword cppSTLtype const_pointer
syntax keyword cppSTLtype const_reference
syntax keyword cppSTLtype container_type
syntax keyword cppSTLtype deque
syntax keyword cppSTLtype difference_type
syntax keyword cppSTLtype iterator_category
syntax keyword cppSTLtype div_t
syntax keyword cppSTLtype double_t
syntax keyword cppSTLtype filebuf
syntax keyword cppSTLtype first_type
syntax keyword cppSTLtype float_denorm_style
syntax keyword cppSTLtype float_round_style
syntax keyword cppSTLtype float_t
syntax keyword cppSTLtype fstream
syntax keyword cppSTLtype gslice_array
syntax keyword cppSTLtype ifstream
syntax keyword cppSTLtype imaxdiv_t
syntax keyword cppSTLtype indirect_array
syntax keyword cppSTLtype int_type
syntax keyword cppSTLtype ios_base
syntax keyword cppSTLtype basic_ios
syntax keyword cppSTLtype fpos
syntax keyword cppSTLtype ios
syntax keyword cppSTLtype iostream
syntax keyword cppSTLtype istream
syntax keyword cppSTLtype istringstream
syntax keyword cppSTLtype istrstream
syntax keyword cppSTLtype iterator_traits
syntax keyword cppSTLtype key_compare
syntax keyword cppSTLtype key_type
syntax keyword cppSTLtype ldiv_t
syntax keyword cppSTLtype list
syntax keyword cppSTLtype lldiv_t
syntax keyword cppSTLtype map
syntax keyword cppSTLtype mapped_type
syntax keyword cppSTLtype mask_array
syntax keyword cppSTLtype mbstate_t
syntax keyword cppSTLtype mem_fun1_t
syntax keyword cppSTLtype mem_fun_ref1_t
syntax keyword cppSTLtype mem_fun_ref_t
syntax keyword cppSTLtype mem_fun_t
syntax keyword cppSTLtype multimap
syntax keyword cppSTLtype multiset
syntax keyword cppSTLtype nothrow_t
syntax keyword cppSTLtype numeric_limits
syntax keyword cppSTLtype off_type
syntax keyword cppSTLtype ofstream
syntax keyword cppSTLtype ostream
syntax keyword cppSTLtype ostringstream
syntax keyword cppSTLtype ostrstream
syntax keyword cppSTLtype pair
syntax keyword cppSTLtype pointer
syntax keyword cppSTLtype pointer_to_binary_function
syntax keyword cppSTLtype pointer_to_unary_function
syntax keyword cppSTLtype pos_type
syntax keyword cppSTLtype priority_queue
syntax keyword cppSTLtype queue
syntax keyword cppSTLtype reference
syntax keyword cppSTLtype second_type
syntax keyword cppSTLtype seekdir
syntax keyword cppSTLtype sequence_buffer
syntax keyword cppSTLtype set
syntax keyword cppSTLtype sig_atomic_t
syntax keyword cppSTLtype size_type
syntax keyword cppSTLtype slice_array
syntax keyword cppSTLtype stack
syntax keyword cppSTLtype stream
syntax keyword cppSTLtype streambuf
syntax keyword cppSTLtype streamoff
syntax keyword cppSTLtype streampos
syntax keyword cppSTLtype streamsize
syntax keyword cppSTLtype string
syntax keyword cppSTLtype stringbuf
syntax keyword cppSTLtype stringstream
syntax keyword cppSTLtype strstream
syntax keyword cppSTLtype strstreambuf
syntax keyword cppSTLtype temporary_buffer
syntax keyword cppSTLtype test_type
syntax keyword cppSTLtype time_t
syntax keyword cppSTLtype tm
syntax keyword cppSTLtype traits_type
syntax keyword cppSTLtype type_info
syntax keyword cppSTLtype u16string
syntax keyword cppSTLtype u32string
syntax keyword cppSTLtype unary_compose
syntax keyword cppSTLtype unary_negate
syntax keyword cppSTLtype valarray
syntax keyword cppSTLtype value_compare
syntax keyword cppSTLtype value_type
syntax keyword cppSTLtype vector
syntax keyword cppSTLtype wctrans_t
syntax keyword cppSTLtype wctype_t
syntax keyword cppSTLtype wfilebuf
syntax keyword cppSTLtype wfstream
syntax keyword cppSTLtype wifstream
syntax keyword cppSTLtype wint_t
syntax keyword cppSTLtype wios
syntax keyword cppSTLtype wiostream
syntax keyword cppSTLtype wistream
syntax keyword cppSTLtype wistringstream
syntax keyword cppSTLtype wofstream
syntax keyword cppSTLtype wostream
syntax keyword cppSTLtype wostringstream
syntax keyword cppSTLtype wstreambuf
syntax keyword cppSTLtype wstreampos
syntax keyword cppSTLtype wstring
syntax keyword cppSTLtype wstringbuf
syntax keyword cppSTLtype wstringstream

" locale
syntax keyword cppSTLtype locale
syntax keyword cppSTLtype ctype_base
syntax keyword cppSTLtype codecvt_base
syntax keyword cppSTLtype messages_base
syntax keyword cppSTLtype time_base
syntax keyword cppSTLtype money_base
syntax keyword cppSTLtype ctype
syntax keyword cppSTLtype codecvt
syntax keyword cppSTLtype collate
syntax keyword cppSTLtype messages
syntax keyword cppSTLtype time_get
syntax keyword cppSTLtype time_put
syntax keyword cppSTLtype num_get
syntax keyword cppSTLtype num_put
syntax keyword cppSTLtype numpunct
syntax keyword cppSTLtype money_get
syntax keyword cppSTLtype money_put
syntax keyword cppSTLtype moneypunct
syntax keyword cppSTLtype ctype_byname
syntax keyword cppSTLtype codecvt_byname
syntax keyword cppSTLtype messages_byname
syntax keyword cppSTLtype collate_byname
syntax keyword cppSTLtype time_get_byname
syntax keyword cppSTLtype time_put_byname
syntax keyword cppSTLtype numpunct_byname
syntax keyword cppSTLtype moneypunct_byname

" template functions that are called with template parameters, like
" std::use_facet<std::moneypunct<char, true>>(loc).curr_symbol()
syntax keyword cppSTLfunction use_facet
syntax keyword cppSTLfunction has_facet

" syntax keyword cppSTLfunction isspace isblank iscntrl isupper islower isalpha
" syntax keyword cppSTLfunction isdigit ispunct isxdigit isalnum isprint isgraph

" std::get is a template function, so when called as std::get<N>(t), we want it
" to be highlighted as a function
syntax keyword cppSTLfunction get

" syntax keyword cppSTLfunction abort
" syntax keyword cppSTLfunction abs
" syntax keyword cppSTLfunction accumulate
" syntax keyword cppSTLfunction acos
" syntax keyword cppSTLfunction adjacent_difference
" syntax keyword cppSTLfunction adjacent_find
" syntax keyword cppSTLfunction adjacent_find_if
" syntax keyword cppSTLfunction advance
" syntax keyword cppSTLfunction append
" syntax keyword cppSTLfunction arg
" syntax keyword cppSTLfunction asctime
" syntax keyword cppSTLfunction asin
" syntax keyword cppSTLfunction assert
" syntax keyword cppSTLfunction assign
" syntax keyword cppSTLfunction at
" syntax keyword cppSTLfunction atan
" syntax keyword cppSTLfunction atan2
" syntax keyword cppSTLfunction atexit
" syntax keyword cppSTLfunction atof
" syntax keyword cppSTLfunction atoi
" syntax keyword cppSTLfunction atol
" syntax keyword cppSTLfunction atoll
" syntax keyword cppSTLfunction back
" syntax keyword cppSTLfunction back_inserter
" syntax keyword cppSTLfunction bad
" syntax keyword cppSTLfunction beg
" syntax keyword cppSTLfunction binary_compose
" syntax keyword cppSTLfunction binary_negate
" syntax keyword cppSTLfunction binary_search
" syntax keyword cppSTLfunction bind1st
" syntax keyword cppSTLfunction bind2nd
" syntax keyword cppSTLfunction binder1st
" syntax keyword cppSTLfunction binder2nd
" syntax keyword cppSTLfunction bsearch
" syntax keyword cppSTLfunction calloc
" syntax keyword cppSTLfunction capacity
" syntax keyword cppSTLfunction ceil
" syntax keyword cppSTLfunction clear
" syntax keyword cppSTLfunction clearerr
" syntax keyword cppSTLfunction clock
" syntax keyword cppSTLfunction close
" syntax keyword cppSTLfunction compare
" syntax keyword cppSTLfunction conj
" syntax keyword cppSTLfunction construct
" syntax keyword cppSTLfunction copy
" syntax keyword cppSTLfunction copy_backward
" syntax keyword cppSTLfunction cos
" syntax keyword cppSTLfunction cosh
" syntax keyword cppSTLfunction count
" syntax keyword cppSTLfunction count_if
" syntax keyword cppSTLfunction c_str
" syntax keyword cppSTLfunction ctime
" syntax keyword cppSTLfunction denorm_min
" syntax keyword cppSTLfunction destroy
" syntax keyword cppSTLfunction difftime
" syntax keyword cppSTLfunction distance
" syntax keyword cppSTLfunction div
" syntax keyword cppSTLfunction empty
" syntax keyword cppSTLfunction eof
" syntax keyword cppSTLfunction epsilon
" syntax keyword cppSTLfunction equal
" syntax keyword cppSTLfunction equal_range
" syntax keyword cppSTLfunction erase
" syntax keyword cppSTLfunction exit
" syntax keyword cppSTLfunction exp
" syntax keyword cppSTLfunction fabs
" syntax keyword cppSTLfunction fail
" syntax keyword cppSTLfunction failure
" syntax keyword cppSTLfunction fclose
" syntax keyword cppSTLfunction feof
" syntax keyword cppSTLfunction ferror
" syntax keyword cppSTLfunction fflush
" syntax keyword cppSTLfunction fgetc
" syntax keyword cppSTLfunction fgetpos
" syntax keyword cppSTLfunction fgets
" syntax keyword cppSTLfunction fill
" syntax keyword cppSTLfunction fill_n
" syntax keyword cppSTLfunction find
" syntax keyword cppSTLfunction find_end
" syntax keyword cppSTLfunction find_first_not_of
" syntax keyword cppSTLfunction find_first_of
" syntax keyword cppSTLfunction find_if
" syntax keyword cppSTLfunction find_last_not_of
" syntax keyword cppSTLfunction find_last_of
" syntax keyword cppSTLfunction first
" syntax keyword cppSTLfunction flags
" syntax keyword cppSTLfunction flip
" syntax keyword cppSTLfunction floor
" syntax keyword cppSTLfunction flush
" syntax keyword cppSTLfunction fmod
" syntax keyword cppSTLfunction fopen
" syntax keyword cppSTLfunction for_each
" syntax keyword cppSTLfunction fprintf
" syntax keyword cppSTLfunction fputc
" syntax keyword cppSTLfunction fputs
" syntax keyword cppSTLfunction fread
" syntax keyword cppSTLfunction free
" syntax keyword cppSTLfunction freopen
" syntax keyword cppSTLfunction frexp
" syntax keyword cppSTLfunction front
" syntax keyword cppSTLfunction fscanf
" syntax keyword cppSTLfunction fseek
" syntax keyword cppSTLfunction fsetpos
" syntax keyword cppSTLfunction ftell
" syntax keyword cppSTLfunction fwide
" syntax keyword cppSTLfunction fwprintf
" syntax keyword cppSTLfunction fwrite
" syntax keyword cppSTLfunction fwscanf
" syntax keyword cppSTLfunction gcount
" syntax keyword cppSTLfunction generate
" syntax keyword cppSTLfunction generate_n
" syntax keyword cppSTLfunction get_allocator
" syntax keyword cppSTLfunction getc
" syntax keyword cppSTLfunction getchar
" syntax keyword cppSTLfunction getenv
" syntax keyword cppSTLfunction getline
" syntax keyword cppSTLfunction gets
" syntax keyword cppSTLfunction get_temporary_buffer
" syntax keyword cppSTLfunction gmtime
" syntax keyword cppSTLfunction good
" syntax keyword cppSTLfunction ignore
" syntax keyword cppSTLfunction imag
" syntax keyword cppSTLfunction in
" syntax keyword cppSTLfunction includes
" syntax keyword cppSTLfunction infinity
" syntax keyword cppSTLfunction inner_product
" syntax keyword cppSTLfunction inplace_merge
" syntax keyword cppSTLfunction insert
" syntax keyword cppSTLfunction inserter
" syntax keyword cppSTLfunction ios
" syntax keyword cppSTLfunction ios_base
" syntax keyword cppSTLfunction iostate
" syntax keyword cppSTLfunction iota
" syntax keyword cppSTLfunction isalnum
" syntax keyword cppSTLfunction isalpha
" syntax keyword cppSTLfunction iscntrl
" syntax keyword cppSTLfunction isdigit
" syntax keyword cppSTLfunction isgraph
" syntax keyword cppSTLfunction islower
" syntax keyword cppSTLfunction is_open
" syntax keyword cppSTLfunction isprint
" syntax keyword cppSTLfunction ispunct
" syntax keyword cppSTLfunction isspace
" syntax keyword cppSTLfunction isupper
" syntax keyword cppSTLfunction isxdigit
" syntax keyword cppSTLfunction iterator_category
" syntax keyword cppSTLfunction iter_swap
" syntax keyword cppSTLfunction jmp_buf
" syntax keyword cppSTLfunction key_comp
" syntax keyword cppSTLfunction labs
" syntax keyword cppSTLfunction ldexp
" syntax keyword cppSTLfunction ldiv
" syntax keyword cppSTLfunction length
" syntax keyword cppSTLfunction lexicographical_compare
" syntax keyword cppSTLfunction lexicographical_compare_3way
" syntax keyword cppSTLfunction llabs
" syntax keyword cppSTLfunction lldiv
" syntax keyword cppSTLfunction localtime
" syntax keyword cppSTLfunction log
" syntax keyword cppSTLfunction log10
" syntax keyword cppSTLfunction longjmp
" syntax keyword cppSTLfunction lower_bound
" syntax keyword cppSTLfunction make_heap
" syntax keyword cppSTLfunction make_pair
" syntax keyword cppSTLfunction malloc
" syntax keyword cppSTLfunction max
" syntax keyword cppSTLfunction max_element
" syntax keyword cppSTLfunction max_size
" syntax keyword cppSTLfunction memchr
" syntax keyword cppSTLfunction memcpy
" syntax keyword cppSTLfunction mem_fun
" syntax keyword cppSTLfunction mem_fun_ref
" syntax keyword cppSTLfunction memmove
" syntax keyword cppSTLfunction memset
" syntax keyword cppSTLfunction merge
" syntax keyword cppSTLfunction min
" syntax keyword cppSTLfunction min_element
" syntax keyword cppSTLfunction mismatch
" syntax keyword cppSTLfunction mktime
" syntax keyword cppSTLfunction modf
" syntax keyword cppSTLfunction next_permutation
" syntax keyword cppSTLfunction none
" syntax keyword cppSTLfunction norm
" syntax keyword cppSTLfunction not1
" syntax keyword cppSTLfunction not2
" syntax keyword cppSTLfunction nth_element
" syntax keyword cppSTLfunction open
" syntax keyword cppSTLfunction partial_sort
" syntax keyword cppSTLfunction partial_sort_copy
" syntax keyword cppSTLfunction partial_sum
" syntax keyword cppSTLfunction partition
" syntax keyword cppSTLfunction peek
" syntax keyword cppSTLfunction perror
" syntax keyword cppSTLfunction polar
" syntax keyword cppSTLfunction pop
" syntax keyword cppSTLfunction pop_back
" syntax keyword cppSTLfunction pop_front
" syntax keyword cppSTLfunction pop_heap
" syntax keyword cppSTLfunction pow
" syntax keyword cppSTLfunction power
" syntax keyword cppSTLfunction precision
" syntax keyword cppSTLfunction prev_permutation
" syntax keyword cppSTLfunction printf
" syntax keyword cppSTLfunction ptr_fun
" syntax keyword cppSTLfunction push
" syntax keyword cppSTLfunction push_back
" syntax keyword cppSTLfunction push_front
" syntax keyword cppSTLfunction push_heap
" syntax keyword cppSTLfunction put
" syntax keyword cppSTLfunction putback
" syntax keyword cppSTLfunction putc
" syntax keyword cppSTLfunction putchar
" syntax keyword cppSTLfunction puts
" syntax keyword cppSTLfunction qsort
" syntax keyword cppSTLfunction quiet_NaN
" syntax keyword cppSTLfunction raise
" syntax keyword cppSTLfunction rand
" syntax keyword cppSTLfunction random_sample
" syntax keyword cppSTLfunction random_sample_n
" syntax keyword cppSTLfunction random_shuffle
" syntax keyword cppSTLfunction rbegin
" syntax keyword cppSTLfunction rdbuf
" syntax keyword cppSTLfunction rdstate
" syntax keyword cppSTLfunction read
" syntax keyword cppSTLfunction real
" syntax keyword cppSTLfunction realloc
" syntax keyword cppSTLfunction remove
" syntax keyword cppSTLfunction remove_copy
" syntax keyword cppSTLfunction remove_copy_if
" syntax keyword cppSTLfunction remove_if
" syntax keyword cppSTLfunction rename
" syntax keyword cppSTLfunction rend
" syntax keyword cppSTLfunction replace
" syntax keyword cppSTLfunction replace_copy
" syntax keyword cppSTLfunction replace_copy_if
" syntax keyword cppSTLfunction replace_if
" syntax keyword cppSTLfunction reserve
" syntax keyword cppSTLfunction reset
" syntax keyword cppSTLfunction resize
" syntax keyword cppSTLfunction return_temporary_buffer
" syntax keyword cppSTLfunction reverse
" syntax keyword cppSTLfunction reverse_copy
" syntax keyword cppSTLfunction rewind
" syntax keyword cppSTLfunction rfind
" syntax keyword cppSTLfunction rotate
" syntax keyword cppSTLfunction rotate_copy
" syntax keyword cppSTLfunction round_error
" syntax keyword cppSTLfunction scanf
" syntax keyword cppSTLfunction search
" syntax keyword cppSTLfunction search_n
" syntax keyword cppSTLfunction second
" syntax keyword cppSTLfunction seekg
" syntax keyword cppSTLfunction seekp
" syntax keyword cppSTLfunction setbuf
" syntax keyword cppSTLfunction set_difference
" syntax keyword cppSTLfunction setf
" syntax keyword cppSTLfunction set_intersection
" syntax keyword cppSTLfunction setjmp
" syntax keyword cppSTLfunction setlocale
" syntax keyword cppSTLfunction set_new_handler
" syntax keyword cppSTLfunction set_symmetric_difference
" syntax keyword cppSTLfunction set_union
" syntax keyword cppSTLfunction setvbuf
" syntax keyword cppSTLfunction signal
" syntax keyword cppSTLfunction signaling_NaN
" syntax keyword cppSTLfunction sin
" syntax keyword cppSTLfunction sinh
" syntax keyword cppSTLfunction size
" syntax keyword cppSTLfunction sort
" syntax keyword cppSTLfunction sort_heap
" syntax keyword cppSTLfunction splice
" syntax keyword cppSTLfunction sprintf
" syntax keyword cppSTLfunction sqrt
" syntax keyword cppSTLfunction srand
" syntax keyword cppSTLfunction sscanf
" syntax keyword cppSTLfunction stable_partition
" syntax keyword cppSTLfunction stable_sort
" syntax keyword cppSTLfunction str
" syntax keyword cppSTLfunction strcat
" syntax keyword cppSTLfunction strchr
" syntax keyword cppSTLfunction strcmp
" syntax keyword cppSTLfunction strcoll
" syntax keyword cppSTLfunction strcpy
" syntax keyword cppSTLfunction strcspn
" syntax keyword cppSTLfunction strerror
" syntax keyword cppSTLfunction strftime
" syntax keyword cppSTLfunction string
" syntax keyword cppSTLfunction strlen
" syntax keyword cppSTLfunction strncat
" syntax keyword cppSTLfunction strncmp
" syntax keyword cppSTLfunction strncpy
" syntax keyword cppSTLfunction strpbrk
" syntax keyword cppSTLfunction strrchr
" syntax keyword cppSTLfunction strspn
" syntax keyword cppSTLfunction strstr
" syntax keyword cppSTLfunction strtod
" syntax keyword cppSTLfunction strtof
" syntax keyword cppSTLfunction strtok
" syntax keyword cppSTLfunction strtol
" syntax keyword cppSTLfunction strtold
" syntax keyword cppSTLfunction strtoll
" syntax keyword cppSTLfunction strtoul
" syntax keyword cppSTLfunction strxfrm
" syntax keyword cppSTLfunction substr
" syntax keyword cppSTLfunction swap
" syntax keyword cppSTLfunction swap_ranges
" syntax keyword cppSTLfunction swprintf
" syntax keyword cppSTLfunction swscanf
" syntax keyword cppSTLfunction sync_with_stdio
" syntax keyword cppSTLfunction system
" syntax keyword cppSTLfunction tan
" syntax keyword cppSTLfunction tanh
" syntax keyword cppSTLfunction tellg
" syntax keyword cppSTLfunction tellp
" syntax keyword cppSTLfunction terminate_handler
" syntax keyword cppSTLfunction terminate
" syntax keyword cppSTLfunction set_terminate
" syntax keyword cppSTLfunction test
" syntax keyword cppSTLfunction time
" syntax keyword cppSTLfunction tmpfile
" syntax keyword cppSTLfunction tmpnam
" syntax keyword cppSTLfunction tolower
" syntax keyword cppSTLfunction top
" syntax keyword cppSTLfunction to_string
" syntax keyword cppSTLfunction to_ulong
" syntax keyword cppSTLfunction toupper
" syntax keyword cppSTLfunction to_wstring
" syntax keyword cppSTLfunction transform
" syntax keyword cppSTLfunction unary_compose
" syntax keyword cppSTLfunction unget
" syntax keyword cppSTLfunction ungetc
" syntax keyword cppSTLfunction uninitialized_copy
" syntax keyword cppSTLfunction uninitialized_copy_n
" syntax keyword cppSTLfunction uninitialized_fill
" syntax keyword cppSTLfunction uninitialized_fill_n
" syntax keyword cppSTLfunction unique
" syntax keyword cppSTLfunction unique_copy
" syntax keyword cppSTLfunction unsetf
" syntax keyword cppSTLfunction upper_bound
" syntax keyword cppSTLfunction va_arg
" syntax keyword cppSTLfunction va_copy
" syntax keyword cppSTLfunction va_end
" syntax keyword cppSTLfunction value_comp
" syntax keyword cppSTLfunction va_start
" syntax keyword cppSTLfunction vfprintf
" syntax keyword cppSTLfunction vfwprintf
" syntax keyword cppSTLfunction vprintf
" syntax keyword cppSTLfunction vsprintf
" syntax keyword cppSTLfunction vswprintf
" syntax keyword cppSTLfunction vwprintf
" syntax keyword cppSTLfunction width
" syntax keyword cppSTLfunction wprintf
" syntax keyword cppSTLfunction write
" syntax keyword cppSTLfunction wscanf
" syntax keyword cppSTLfunction mblen
" syntax keyword cppSTLfunction mbtowc
" syntax keyword cppSTLfunction wctomb
" syntax keyword cppSTLfunction mbstowcs
" syntax keyword cppSTLfunction wcstombs
" syntax keyword cppSTLfunction mbsinit
" syntax keyword cppSTLfunction btowc
" syntax keyword cppSTLfunction wctob
" syntax keyword cppSTLfunction mbrlen
" syntax keyword cppSTLfunction mbrtowc
" syntax keyword cppSTLfunction wcrtomb
" syntax keyword cppSTLfunction mbsrtowcs
" syntax keyword cppSTLfunction wcsrtombs
" syntax keyword cppSTLfunction iswalnum
" syntax keyword cppSTLfunction iswalpha
" syntax keyword cppSTLfunction iswlower
" syntax keyword cppSTLfunction iswupper
" syntax keyword cppSTLfunction iswdigit
" syntax keyword cppSTLfunction iswxdigit
" syntax keyword cppSTLfunction iswcntrl
" syntax keyword cppSTLfunction iswgraph
" syntax keyword cppSTLfunction iswspace
" syntax keyword cppSTLfunction iswprint
" syntax keyword cppSTLfunction iswpunct
" syntax keyword cppSTLfunction iswctype
" syntax keyword cppSTLfunction wctype
" syntax keyword cppSTLfunction towlower
" syntax keyword cppSTLfunction towupper
" syntax keyword cppSTLfunction towctrans
" syntax keyword cppSTLfunction wctrans
" syntax keyword cppSTLfunction wcstol
" syntax keyword cppSTLfunction wcstoll
" syntax keyword cppSTLfunction wcstoul
" syntax keyword cppSTLfunction wcstoull
" syntax keyword cppSTLfunction wcstof
" syntax keyword cppSTLfunction wcstod
" syntax keyword cppSTLfunction wcstold
" syntax keyword cppSTLfunction wcscpy
" syntax keyword cppSTLfunction wcsncpy
" syntax keyword cppSTLfunction wcscat
" syntax keyword cppSTLfunction wcsncat
" syntax keyword cppSTLfunction wcsxfrm
" syntax keyword cppSTLfunction wcslen
" syntax keyword cppSTLfunction wcscmp
" syntax keyword cppSTLfunction wcsncmp
" syntax keyword cppSTLfunction wcscoll
" syntax keyword cppSTLfunction wcschr
" syntax keyword cppSTLfunction wcsrchr
" syntax keyword cppSTLfunction wcsspn
" syntax keyword cppSTLfunction wcscspn
" syntax keyword cppSTLfunction wcspbrk
" syntax keyword cppSTLfunction wcsstr
" syntax keyword cppSTLfunction wcstok
" syntax keyword cppSTLfunction wmemcpy
" syntax keyword cppSTLfunction wmemmove
" syntax keyword cppSTLfunction wmemcmp
" syntax keyword cppSTLfunction wmemchr
" syntax keyword cppSTLfunction wmemset


" C++11 extensions {{{1

if !exists('cpp_no_cpp11')
    syntax keyword cppSTLconstant nullptr

    " containers (array, vector, list, map, set, ...) {{{2
    syntax keyword cppSTLtype array
    " syntax keyword cppSTLfunction cbegin cend
    " syntax keyword cppSTLfunction crbegin crend
    " syntax keyword cppSTLfunction shrink_to_fit
    " syntax keyword cppSTLfunction emplace
    " syntax keyword cppSTLfunction emplace_back
    " syntax keyword cppSTLfunction emplace_front
    " syntax keyword cppSTLfunction emplace_hint

    " algorithm {{{2
    " syntax keyword cppSTLfunction all_of any_of none_of
    " syntax keyword cppSTLfunction find_if_not
    " syntax keyword cppSTLfunction copy_if
    " syntax keyword cppSTLfunction copy_n
    " syntax keyword cppSTLfunction move
    " syntax keyword cppSTLfunction move_backward
    " syntax keyword cppSTLfunction shuffle
    " syntax keyword cppSTLfunction is_partitioned
    " syntax keyword cppSTLfunction partition_copy
    " syntax keyword cppSTLfunction partition_point
    " syntax keyword cppSTLfunction is_sorted
    " syntax keyword cppSTLfunction is_sorted_until
    " syntax keyword cppSTLfunction is_heap
    " syntax keyword cppSTLfunction is_heap_until
    " syntax keyword cppSTLfunction minmax
    " syntax keyword cppSTLfunction minmax_element
    " syntax keyword cppSTLfunction is_permutation
    " syntax keyword cppSTLfunction itoa

    " atomic {{{2
    syntax keyword cppSTLtype atomic
    syntax keyword cppSTLtype atomic_flag
    syntax keyword cppSTLtype atomic_bool
    syntax keyword cppSTLtype atomic_char
    syntax keyword cppSTLtype atomic_schar
    syntax keyword cppSTLtype atomic_uchar
    syntax keyword cppSTLtype atomic_short
    syntax keyword cppSTLtype atomic_ushort
    syntax keyword cppSTLtype atomic_int
    syntax keyword cppSTLtype atomic_uint
    syntax keyword cppSTLtype atomic_long
    syntax keyword cppSTLtype atomic_ulong
    syntax keyword cppSTLtype atomic_llong
    syntax keyword cppSTLtype atomic_ullong
    syntax keyword cppSTLtype atomic_char16_t
    syntax keyword cppSTLtype atomic_char32_t
    syntax keyword cppSTLtype atomic_wchar_t
    syntax keyword cppSTLtype atomic_int_least8_t
    syntax keyword cppSTLtype atomic_uint_least8_t
    syntax keyword cppSTLtype atomic_int_least16_t
    syntax keyword cppSTLtype atomic_uint_least16_t
    syntax keyword cppSTLtype atomic_int_least32_t
    syntax keyword cppSTLtype atomic_uint_least32_t
    syntax keyword cppSTLtype atomic_int_least64_t
    syntax keyword cppSTLtype atomic_uint_least64_t
    syntax keyword cppSTLtype atomic_int_fast8_t
    syntax keyword cppSTLtype atomic_uint_fast8_t
    syntax keyword cppSTLtype atomic_int_fast16_t
    syntax keyword cppSTLtype atomic_uint_fast16_t
    syntax keyword cppSTLtype atomic_int_fast32_t
    syntax keyword cppSTLtype atomic_uint_fast32_t
    syntax keyword cppSTLtype atomic_int_fast64_t
    syntax keyword cppSTLtype atomic_uint_fast64_t
    syntax keyword cppSTLtype atomic_intptr_t
    syntax keyword cppSTLtype atomic_uintptr_t
    syntax keyword cppSTLtype atomic_size_t
    syntax keyword cppSTLtype atomic_ptrdiff_t
    syntax keyword cppSTLtype atomic_intmax_t
    syntax keyword cppSTLtype atomic_uintmax_t
    syntax keyword cppSTLconstant ATOMIC_FLAG_INIT
    syntax keyword cppSTLenum memory_order

    " syntax keyword cppSTLfunction is_lock_free
    " syntax keyword cppSTLfunction compare_exchange_weak
    " syntax keyword cppSTLfunction compare_exchange_strong
    " syntax keyword cppSTLfunction fetch_add
    " syntax keyword cppSTLfunction fetch_sub
    " syntax keyword cppSTLfunction fetch_and
    " syntax keyword cppSTLfunction fetch_or
    " syntax keyword cppSTLfunction fetch_xor
    " syntax keyword cppSTLfunction atomic_is_lock_free
    " syntax keyword cppSTLfunction atomic_store
    " syntax keyword cppSTLfunction atomic_store_explicit
    " syntax keyword cppSTLfunction atomic_load
    " syntax keyword cppSTLfunction atomic_load_explicit
    " syntax keyword cppSTLfunction atomic_exchange
    " syntax keyword cppSTLfunction atomic_exchange_explicit
    " syntax keyword cppSTLfunction atomic_compare_exchange_weak
    " syntax keyword cppSTLfunction atomic_compare_exchange_weak_explicit
    " syntax keyword cppSTLfunction atomic_compare_exchange_strong
    " syntax keyword cppSTLfunction atomic_compare_exchange_strong_explicit
    " syntax keyword cppSTLfunction atomic_fetch_add
    " syntax keyword cppSTLfunction atomic_fetch_add_explicit
    " syntax keyword cppSTLfunction atomic_fetch_sub
    " syntax keyword cppSTLfunction atomic_fetch_sub_explicit
    " syntax keyword cppSTLfunction atomic_fetch_and
    " syntax keyword cppSTLfunction atomic_fetch_and_explicit
    " syntax keyword cppSTLfunction atomic_fetch_or
    " syntax keyword cppSTLfunction atomic_fetch_or_explicit
    " syntax keyword cppSTLfunction atomic_fetch_xor
    " syntax keyword cppSTLfunction atomic_fetch_xor_explicit
    " syntax keyword cppSTLfunction atomic_flag_test_and_set
    " syntax keyword cppSTLfunction atomic_flag_test_and_set_explicit
    " syntax keyword cppSTLfunction atomic_flag_clear
    " syntax keyword cppSTLfunction atomic_flag_clear_explicit
    " syntax keyword cppSTLfunction atomic_init
    " syntax keyword cppSTLfunction ATOMIC_VAR_INIT
    " syntax keyword cppSTLfunction kill_dependency
    " syntax keyword cppSTLfunction atomic_thread_fence
    " syntax keyword cppSTLfunction atomic_signal_fence
    " syntax keyword cppSTLfunction store
    " syntax keyword cppSTLfunction load
    " syntax keyword cppSTLfunction exchange

    " bitset {{{2
    " syntax keyword cppSTLfunction all
    " syntax keyword cppSTLfunction to_ullong

    " cinttypes {{{2
    " syntax keyword cppSTLfunction strtoimax
    " syntax keyword cppSTLfunction strtoumax
    " syntax keyword cppSTLfunction wcstoimax
    " syntax keyword cppSTLfunction wcstoumax

    " chrono {{{2
    syntax keyword cppSTLnamespace chrono
    syntax keyword cppSTLcast duration_cast
    syntax keyword cppSTLcast time_point_cast
    syntax keyword cppSTLtype duration
    syntax keyword cppSTLtype system_clock
    syntax keyword cppSTLtype steady_clock
    syntax keyword cppSTLtype high_resolution_clock
    syntax keyword cppSTLtype time_point
    syntax keyword cppSTLtype nanoseconds
    syntax keyword cppSTLtype microseconds
    syntax keyword cppSTLtype milliseconds
    syntax keyword cppSTLtype seconds
    syntax keyword cppSTLtype minutes
    syntax keyword cppSTLtype hours
    syntax keyword cppSTLtype treat_as_floating_point
    syntax keyword cppSTLtype duration_values
    " syntax keyword cppSTLtype rep period
    " syntax keyword cppSTLfunction time_since_epoch
    " syntax keyword cppSTLfunction zero
    " syntax keyword cppSTLfunction now
    " syntax keyword cppSTLfunction to_time_t
    " syntax keyword cppSTLfunction from_time_t

    " complex {{{2
    " syntax keyword cppSTLfunction proj

    " condition_variable {{{2
    syntax keyword cppSTLtype condition_variable
    " syntax keyword cppSTLfunction notify_all
    " syntax keyword cppSTLfunction notify_one

    " cstddef {{{2
    syntax keyword cppSTLtype nullptr_t max_align_t

    " cstdlib {{{2
    " syntax keyword cppSTLfunction quick_exit
    " syntax keyword cppSTLfunction _Exit
    " syntax keyword cppSTLfunction at_quick_exit

    " cuchar {{{2
    " syntax keyword cppSTLfunction mbrtoc16
    " syntax keyword cppSTLfunction c16rtomb
    " syntax keyword cppSTLfunction mbrtoc32
    " syntax keyword cppSTLfunction c32rtomb

    " exception {{{2
    syntax keyword cppSTLtype exception_ptr
    syntax keyword cppSTLtype nested_exception
    " syntax keyword cppSTLfunction get_terminate
    " syntax keyword cppSTLfunction make_exception_ptr
    " syntax keyword cppSTLfunction current_exception
    " syntax keyword cppSTLfunction rethrow_exception
    " syntax keyword cppSTLfunction throw_with_nested
    " syntax keyword cppSTLfunction rethrow_if_nested
    " syntax keyword cppSTLfunction rethrow_nested

    " functional {{{2
    syntax keyword cppSTLexception bad_function_call
    syntax keyword cppSTLfunctional function
    syntax keyword cppSTLconstant _1 _2 _3 _4 _5 _6 _7 _8 _9
    syntax keyword cppSTLtype hash
    syntax keyword cppSTLtype is_bind_expression
    syntax keyword cppSTLtype is_placeholder
    syntax keyword cppSTLtype reference_wrapper
    " syntax keyword cppSTLfunction bind
    " syntax keyword cppSTLfunction mem_fn
    " syntax keyword cppSTLfunction ref cref

    " iomanip {{{2
    " syntax keyword cppSTLios get_money
    " syntax keyword cppSTLios get_time
    " syntax keyword cppSTLios put_money
    " syntax keyword cppSTLios put_time

    " iterator {{{2
    syntax keyword cppSTLiterator move_iterator
    " syntax keyword cppSTLfunction make_move_iterator
    " syntax keyword cppSTLfunction next prev
    " syntax keyword cppSTLfunction begin end

    " forward_list {{{2
    syntax keyword cppSTLtype forward_list
    " syntax keyword cppSTLfunction before_begin
    " syntax keyword cppSTLfunction cbefore_begin
    " syntax keyword cppSTLfunction insert_after
    " syntax keyword cppSTLfunction emplace_after
    " syntax keyword cppSTLfunction erase_after
    " syntax keyword cppSTLfunction splice_after

    " future {{{2
    syntax keyword cppSTLtype future
    syntax keyword cppSTLtype packaged_task
    syntax keyword cppSTLtype promise
    syntax keyword cppSTLtype shared_future
    syntax keyword cppSTLenum future_status
    syntax keyword cppSTLenum future_errc
    syntax keyword cppSTLenum launch
    syntax keyword cppSTLexception future_error
    " syntax keyword cppSTLfunction get_future
    " syntax keyword cppSTLfunction set_value
    " syntax keyword cppSTLfunction set_value_at_thread_exit
    " syntax keyword cppSTLfunction set_exception
    " syntax keyword cppSTLfunction set_exception_at_thread_exit
    " syntax keyword cppSTLfunction wait_for
    " syntax keyword cppSTLfunction wait_until
    " syntax keyword cppSTLfunction future_category
    " syntax keyword cppSTLfunction make_error_code
    " syntax keyword cppSTLfunction make_error_condition
    " syntax keyword cppSTLfunction make_ready_at_thread_exit
    " syntax keyword cppSTLfunction async
    " syntax keyword cppSTLfunction share
    " syntax keyword cppSTLfunction valid
    " syntax keyword cppSTLfunction wait

    " initializer_list {{{2
    syntax keyword cppSTLtype initializer_list

    " ios {{{2
    syntax keyword cppSTLenum io_errc
    " syntax keyword cppSTLtype is_error_code_enum
    " syntax keyword cppSTLfunction iostream_category
    " syntax keyword cppSTLfunction vscanf vfscanf vsscanf
    " syntax keyword cppSTLfunction snprintf vsnprintf
    " syntax keyword cppSTLfunction vwscanf vfwscanf vswscanf

    " limits {{{2
    syntax keyword cppSTLconstant max_digits10
    " syntax keyword cppSTLfunction lowest

    " locale {{{2
    syntax keyword cppSTLtype wstring_convert
    syntax keyword cppSTLtype wbuffer_convert
    syntax keyword cppSTLtype codecvt_utf8
    syntax keyword cppSTLtype codecvt_utf16
    syntax keyword cppSTLtype codecvt_utf8_utf16
    syntax keyword cppSTLtype codecvt_mode
    syntax keyword cppSTLfunction isblank
    " syntax keyword cppSTLfunction iswblank

    " memory {{{2
    syntax keyword cppSTLtype unique_ptr
    syntax keyword cppSTLtype shared_ptr
    syntax keyword cppSTLtype weak_ptr
    syntax keyword cppSTLtype owner_less
    syntax keyword cppSTLtype enable_shared_from_this
    syntax keyword cppSTLtype default_delete
    syntax keyword cppSTLtype allocator_traits
    syntax keyword cppSTLtype allocator_type
    syntax keyword cppSTLtype void_pointer const_void_pointer
    syntax keyword cppSTLtype propagate_on_container_copy_assignment
    syntax keyword cppSTLtype propagate_on_container_move_assignment
    syntax keyword cppSTLtype propagate_on_container_swap
    syntax keyword cppSTLtype is_always_equal
    syntax keyword cppSTLtype rebind_alloc rebind_traits
    syntax keyword cppSTLtype allocator_arg_t
    syntax keyword cppSTLtype uses_allocator
    syntax keyword cppSTLtype pointer_safety
    syntax keyword cppSTLtype pointer_traits
    syntax keyword cppSTLconstant allocator_arg
    syntax keyword cppSTLexception bad_weak_ptr
    syntax keyword cppSTLcast static_pointer_cast
    syntax keyword cppSTLcast dynamic_pointer_cast
    syntax keyword cppSTLcast const_pointer_cast
    syntax keyword cppSTLfunction make_shared
    syntax keyword cppSTLfunction allocate_shared
    " syntax keyword cppSTLfunction declare_reachable
    " syntax keyword cppSTLfunction undeclare_reachable
    " syntax keyword cppSTLfunction declare_no_pointers
    " syntax keyword cppSTLfunction undeclare_no_pointers
    " syntax keyword cppSTLfunction get_pointer_safety
    " syntax keyword cppSTLfunction addressof
    " syntax keyword cppSTLfunction get_deleter
    " syntax keyword cppSTLfunction align

    " mutex {{{2
    syntax keyword cppSTLtype mutex
    syntax keyword cppSTLtype timed_mutex
    syntax keyword cppSTLtype recursive_mutex
    syntax keyword cppSTLtype recursive_timed_mutex
    syntax keyword cppSTLtype lock_guard
    syntax keyword cppSTLtype unique_lock
    syntax keyword cppSTLtype defer_lock_t
    syntax keyword cppSTLtype try_to_lock_t
    syntax keyword cppSTLtype adopt_lock_t
    syntax keyword cppSTLtype once_flag
    syntax keyword cppSTLtype condition_variable_any
    syntax keyword cppSTLenum cv_status
    syntax keyword cppSTLconstant defer_lock try_to_lock adopt_lock
    " syntax keyword cppSTLfunction try_lock lock unlock try_lock_for try_lock_until
    " syntax keyword cppSTLfunction call_once
    " syntax keyword cppSTLfunction owns_lock
    " syntax keyword cppSTLfunction notify_all_at_thread_exit
    " syntax keyword cppSTLfunction release
    " Note: unique_lock has method 'mutex()', but already set as cppSTLtype
    " syntax keyword cppSTLfunction mutex

    " new {{{2
    syntax keyword cppSTLexception bad_array_new_length
    " syntax keyword cppSTLfunction get_new_handler

    " numerics, cmath {{{2
    syntax keyword cppSTLconstant HUGE_VALF
    syntax keyword cppSTLconstant HUGE_VALL
    syntax keyword cppSTLconstant INFINITY
    syntax keyword cppSTLconstant NAN
    syntax keyword cppSTLconstant math_errhandling
    syntax keyword cppSTLconstant MATH_ERRNO
    syntax keyword cppSTLconstant MATH_ERREXCEPT
    syntax keyword cppSTLconstant FP_NORMAL
    syntax keyword cppSTLconstant FP_SUBNORMAL
    syntax keyword cppSTLconstant FP_ZERO
    syntax keyword cppSTLconstant FP_INFINITY
    syntax keyword cppSTLconstant FP_NAN
    syntax keyword cppSTLconstant FLT_EVAL_METHOD
    " syntax keyword cppSTLfunction imaxabs
    " syntax keyword cppSTLfunction imaxdiv
    " syntax keyword cppSTLfunction remainder
    " syntax keyword cppSTLfunction remquo
    " syntax keyword cppSTLfunction fma
    " syntax keyword cppSTLfunction fmax
    " syntax keyword cppSTLfunction fmin
    " syntax keyword cppSTLfunction fdim
    " syntax keyword cppSTLfunction nan
    " syntax keyword cppSTLfunction nanf
    " syntax keyword cppSTLfunction nanl
    " syntax keyword cppSTLfunction exp2
    " syntax keyword cppSTLfunction expm1
    " syntax keyword cppSTLfunction log1p
    " syntax keyword cppSTLfunction log2
    " syntax keyword cppSTLfunction cbrt
    " syntax keyword cppSTLfunction hypot
    " syntax keyword cppSTLfunction asinh
    " syntax keyword cppSTLfunction acosh
    " syntax keyword cppSTLfunction atanh
    " syntax keyword cppSTLfunction erf
    " syntax keyword cppSTLfunction erfc
    " syntax keyword cppSTLfunction lgamma
    " syntax keyword cppSTLfunction tgamma
    " syntax keyword cppSTLfunction trunc
    " syntax keyword cppSTLfunction round
    " syntax keyword cppSTLfunction lround
    " syntax keyword cppSTLfunction llround
    " syntax keyword cppSTLfunction nearbyint
    " syntax keyword cppSTLfunction rint
    " syntax keyword cppSTLfunction lrint
    " syntax keyword cppSTLfunction llrint
    " syntax keyword cppSTLfunction scalbn
    " syntax keyword cppSTLfunction scalbln
    " syntax keyword cppSTLfunction ilogb
    " syntax keyword cppSTLfunction logb
    " syntax keyword cppSTLfunction nextafter
    " syntax keyword cppSTLfunction nexttoward
    " syntax keyword cppSTLfunction copysign
    " syntax keyword cppSTLfunction fpclassify
    " syntax keyword cppSTLfunction isfinite
    " syntax keyword cppSTLfunction isinf
    " syntax keyword cppSTLfunction isnan
    " syntax keyword cppSTLfunction isnormal
    " syntax keyword cppSTLfunction signbit

    " random {{{2
    syntax keyword cppSTLtype linear_congruential_engine
    syntax keyword cppSTLtype mersenne_twister_engine
    syntax keyword cppSTLtype subtract_with_carry_engine
    syntax keyword cppSTLtype discard_block_engine
    syntax keyword cppSTLtype independent_bits_engine
    syntax keyword cppSTLtype shuffle_order_engine
    syntax keyword cppSTLtype random_device
    syntax keyword cppSTLtype default_random_engine
    syntax keyword cppSTLtype minstd_rand0
    syntax keyword cppSTLtype minstd_rand
    syntax keyword cppSTLtype mt19937
    syntax keyword cppSTLtype mt19937_64
    syntax keyword cppSTLtype ranlux24_base
    syntax keyword cppSTLtype ranlux48_base
    syntax keyword cppSTLtype ranlux24
    syntax keyword cppSTLtype ranlux48
    syntax keyword cppSTLtype knuth_b
    syntax keyword cppSTLtype uniform_int_distribution
    syntax keyword cppSTLtype uniform_real_distribution
    syntax keyword cppSTLtype bernoulli_distribution
    syntax keyword cppSTLtype binomial_distribution
    syntax keyword cppSTLtype negative_binomial_distribution
    syntax keyword cppSTLtype geometric_distribution
    syntax keyword cppSTLtype poisson_distribution
    syntax keyword cppSTLtype exponential_distribution
    syntax keyword cppSTLtype gamma_distribution
    syntax keyword cppSTLtype weibull_distribution
    syntax keyword cppSTLtype extreme_value_distribution
    syntax keyword cppSTLtype normal_distribution
    syntax keyword cppSTLtype lognormal_distribution
    syntax keyword cppSTLtype chi_squared_distribution
    syntax keyword cppSTLtype cauchy_distribution
    syntax keyword cppSTLtype fisher_f_distribution
    syntax keyword cppSTLtype student_t_distribution
    syntax keyword cppSTLtype discrete_distribution
    syntax keyword cppSTLtype piecewise_constant_distribution
    syntax keyword cppSTLtype piecewise_linear_distribution
    syntax keyword cppSTLtype seed_seq
    syntax keyword cppSTLfunction generate_canonical

    " ratio {{{2
    syntax keyword cppSTLtype ratio
    syntax keyword cppSTLtype yocto
    syntax keyword cppSTLtype zepto
    syntax keyword cppSTLtype atto
    syntax keyword cppSTLtype femto
    syntax keyword cppSTLtype pico
    syntax keyword cppSTLtype nano
    syntax keyword cppSTLtype micro
    syntax keyword cppSTLtype milli
    syntax keyword cppSTLtype centi
    syntax keyword cppSTLtype deci
    syntax keyword cppSTLtype deca
    syntax keyword cppSTLtype hecto
    syntax keyword cppSTLtype kilo
    syntax keyword cppSTLtype mega
    syntax keyword cppSTLtype giga
    syntax keyword cppSTLtype tera
    syntax keyword cppSTLtype peta
    syntax keyword cppSTLtype exa
    syntax keyword cppSTLtype zetta
    syntax keyword cppSTLtype yotta
    syntax keyword cppSTLtype ratio_add
    syntax keyword cppSTLtype ratio_subtract
    syntax keyword cppSTLtype ratio_multiply
    syntax keyword cppSTLtype ratio_divide
    syntax keyword cppSTLtype ratio_equal
    syntax keyword cppSTLtype ratio_not_equal
    syntax keyword cppSTLtype ratio_less
    syntax keyword cppSTLtype ratio_less_equal
    syntax keyword cppSTLtype ratio_greater
    syntax keyword cppSTLtype ratio_greater_equal

    " regex {{{2
    syntax keyword cppSTLtype basic_regex
    syntax keyword cppSTLtype sub_match
    syntax keyword cppSTLtype match_results
    syntax keyword cppSTLtype regex_traits
    syntax keyword cppSTLiterator regex_iterator
    syntax keyword cppSTLiterator regex_token_iterator
    syntax keyword cppSTLexception regex_error
    syntax keyword cppSTLtype syntax_option_type match_flag_type error_type
    " syntax keyword cppSTLfunction regex_match regex_search regex_replace

    " scoped_allocator {{{2
    syntax keyword cppSTLtype scoped_allocator_adaptor
    syntax keyword cppSTLtype outer_allocator_type inner_allocator_type

    " string {{{2
    " syntax keyword cppSTLfunction stoi
    " syntax keyword cppSTLfunction stol
    " syntax keyword cppSTLfunction stoll
    " syntax keyword cppSTLfunction stoul
    " syntax keyword cppSTLfunction stoull
    " syntax keyword cppSTLfunction stof
    " syntax keyword cppSTLfunction stod
    " syntax keyword cppSTLfunction stold

    " system_error {{{2
    syntax keyword cppSTLenum errc
    syntax keyword cppSTLexception system_error
    syntax keyword cppSTLtype error_code
    syntax keyword cppSTLtype error_condition
    syntax keyword cppSTLtype error_category
    syntax keyword cppSTLtype is_error_code_enum
    syntax keyword cppSTLtype is_error_condition_enum
    " syntax keyword cppSTLfunction default_error_condition
    " syntax keyword cppSTLfunction generic_category
    " syntax keyword cppSTLfunction system_category
    " syntax keyword cppSTLfunction code
    " syntax keyword cppSTLfunction category
    " syntax keyword cppSTLfunction message
    " syntax keyword cppSTLfunction equivalent

    " thread {{{2
    syntax keyword cppSTLnamespace this_thread
    syntax keyword cppSTLtype thread
    " syntax keyword cppSTLfunction get_id
    " syntax keyword cppSTLfunction sleep_for
    " syntax keyword cppSTLfunction sleep_until
    " syntax keyword cppSTLfunction joinable
    " syntax keyword cppSTLfunction native_handle
    " syntax keyword cppSTLfunction hardware_concurrency
    " syntax keyword cppSTLfunction yield
    " syntax keyword cppSTLfunction join
    " syntax keyword cppSTLfunction detach

    " tuple {{{2
    syntax keyword cppSTLtype tuple
    syntax keyword cppSTLtype tuple_size
    syntax keyword cppSTLtype tuple_element
    syntax keyword cppSTLfunction make_tuple
    syntax keyword cppSTLfunction tie
    syntax keyword cppSTLfunction forward_as_tuple
    syntax keyword cppSTLfunction tuple_cat
    " Note: 'ignore' is already set as cppSTLfunction
    " syntax keyword cppSTLconstant ignore

    " typeindex {{{2
    syntax keyword cppSTLtype type_index

    " type_traits {{{2
    syntax keyword cppSTLtype is_void
    syntax keyword cppSTLtype is_integral
    syntax keyword cppSTLtype is_floating_point
    syntax keyword cppSTLtype is_array
    syntax keyword cppSTLtype is_enum
    syntax keyword cppSTLtype is_union
    syntax keyword cppSTLtype is_class
    syntax keyword cppSTLtype is_function
    syntax keyword cppSTLtype is_pointer
    syntax keyword cppSTLtype is_lvalue_reference
    syntax keyword cppSTLtype is_rvalue_reference
    syntax keyword cppSTLtype is_member_object_pointer
    syntax keyword cppSTLtype is_member_function_pointer
    syntax keyword cppSTLtype is_fundamental
    syntax keyword cppSTLtype is_arithmetic
    syntax keyword cppSTLtype is_scalar
    syntax keyword cppSTLtype is_object
    syntax keyword cppSTLtype is_compound
    syntax keyword cppSTLtype is_reference
    syntax keyword cppSTLtype is_member_pointer
    syntax keyword cppSTLtype is_const
    syntax keyword cppSTLtype is_volatile
    syntax keyword cppSTLtype is_trivial
    syntax keyword cppSTLtype is_trivially_copyable
    syntax keyword cppSTLtype is_standard_layout
    syntax keyword cppSTLtype is_pod
    syntax keyword cppSTLtype is_literal_type
    syntax keyword cppSTLtype is_empty
    syntax keyword cppSTLtype is_polymorphic
    syntax keyword cppSTLtype is_abstract
    syntax keyword cppSTLtype is_signed
    syntax keyword cppSTLtype is_unsigned
    syntax keyword cppSTLtype is_constructible
    syntax keyword cppSTLtype is_trivially_constructible
    syntax keyword cppSTLtype is_nothrow_constructible
    syntax keyword cppSTLtype is_default_constructible
    syntax keyword cppSTLtype is_trivially_default_constructible
    syntax keyword cppSTLtype is_nothrow_default_constructible
    syntax keyword cppSTLtype is_copy_constructible
    syntax keyword cppSTLtype is_trivially_copy_constructible
    syntax keyword cppSTLtype is_nothrow_copy_constructible
    syntax keyword cppSTLtype is_move_constructible
    syntax keyword cppSTLtype is_trivially_move_constructible
    syntax keyword cppSTLtype is_nothrow_move_constructible
    syntax keyword cppSTLtype is_assignable
    syntax keyword cppSTLtype is_trivially_assignable
    syntax keyword cppSTLtype is_nothrow_assignable
    syntax keyword cppSTLtype is_copy_assignable
    syntax keyword cppSTLtype is_trivially_copy_assignable
    syntax keyword cppSTLtype is_nothrow_copy_assignable
    syntax keyword cppSTLtype is_move_assignable
    syntax keyword cppSTLtype is_trivially_move_assignable
    syntax keyword cppSTLtype is_nothrow_move_assignable
    syntax keyword cppSTLtype is_destructible
    syntax keyword cppSTLtype is_trivially_destructible
    syntax keyword cppSTLtype is_nothrow_destructible
    syntax keyword cppSTLtype has_virtual_destructor
    syntax keyword cppSTLtype alignment_of
    syntax keyword cppSTLtype rank
    syntax keyword cppSTLtype extent
    syntax keyword cppSTLtype is_same
    syntax keyword cppSTLtype is_base_of
    syntax keyword cppSTLtype is_convertible
    syntax keyword cppSTLtype remove_cv
    syntax keyword cppSTLtype remove_const
    syntax keyword cppSTLtype remove_volatile
    syntax keyword cppSTLtype add_cv
    syntax keyword cppSTLtype add_const
    syntax keyword cppSTLtype add_volatile
    syntax keyword cppSTLtype remove_reference
    syntax keyword cppSTLtype add_lvalue_reference
    syntax keyword cppSTLtype add_rvalue_reference
    syntax keyword cppSTLtype remove_pointer
    syntax keyword cppSTLtype add_pointer
    syntax keyword cppSTLtype make_signed
    syntax keyword cppSTLtype make_unsigned
    syntax keyword cppSTLtype remove_extent
    syntax keyword cppSTLtype remove_all_extents
    syntax keyword cppSTLtype aligned_storage
    syntax keyword cppSTLtype aligned_union
    syntax keyword cppSTLtype decay
    syntax keyword cppSTLtype enable_if
    syntax keyword cppSTLtype conditional
    syntax keyword cppSTLtype common_type
    syntax keyword cppSTLtype underlying_type
    syntax keyword cppSTLtype result_of
    syntax keyword cppSTLtype integral_constant
    syntax keyword cppSTLtype true_type
    syntax keyword cppSTLtype false_type

    " unordered_map, unordered_set, unordered_multimap, unordered_multiset {{{2
    syntax keyword cppSTLtype unordered_map
    syntax keyword cppSTLtype unordered_set
    syntax keyword cppSTLtype unordered_multimap
    syntax keyword cppSTLtype unordered_multiset
    syntax keyword cppSTLtype hasher
    syntax keyword cppSTLtype key_equal
    syntax keyword cppSTLiterator local_iterator
    syntax keyword cppSTLiterator const_local_iterator
    " syntax keyword cppSTLfunction bucket_count
    " syntax keyword cppSTLfunction max_bucket_count
    " syntax keyword cppSTLfunction bucket_size
    " syntax keyword cppSTLfunction bucket
    " syntax keyword cppSTLfunction load_factor
    " syntax keyword cppSTLfunction max_load_factor
    " syntax keyword cppSTLfunction rehash
    " syntax keyword cppSTLfunction reserve
    " syntax keyword cppSTLfunction hash_function
    " syntax keyword cppSTLfunction key_eq

    " utility {{{2
    syntax keyword cppSTLtype piecewise_construct_t
    syntax keyword cppSTLconstant piecewise_construct
    syntax keyword cppSTLfunction declval
    syntax keyword cppSTLfunction forward
    syntax keyword cppSTLfunction move
    syntax keyword cppSTLfunction move_if_noexcept

    " raw string literals {{{2
    syntax region cppRawString matchgroup=cppRawDelimiter start=@\%(u8\|[uLU]\)\=R"\z([[:alnum:]_{}[\]#<>%:;.?*\+\-/\^&|~!=,"']\{,16}\)(@ end=/)\z1"/ contains=@Spell
    syn match cNumber "0b[01]\+"
    " }}}
endif " C++11


" C++14 extensions {{{1

if !exists('cpp_no_cpp14')
    " chrono {{{2
    syntax keyword cppSTLnamespace literals
    syntax keyword cppSTLnamespace chrono_literals
    " TODO: add literals h, min, s, ms, us, ns
    " syn keyword cppStorageClass?

    " complex {{{2
    " TODO: add literals i, if, il
    " syn keyword cppStorageClass?

    " iomanip {{{2
    " syntax keyword cppSTLfunction quoted

    " iterator {{{2
    " syntax keyword cppSTLfunction make_reverse_iterator

    " memory {{{2
    syntax keyword cppSTLfunction make_unique

    " utility {{{2
    syntax keyword cppSTLtype integer_sequence
    syntax keyword cppSTLtype index_sequence
    syntax keyword cppSTLtype make_integer_sequence
    syntax keyword cppSTLtype make_index_sequence
    syntax keyword cppSTLtype index_sequence_for

    " shared_mutex {{{2
    syntax keyword cppSTLtype shared_timed_mutex
    syntax keyword cppSTLtype shared_lock
    " syntax keyword cppSTLfunction lock_shared
    " syntax keyword cppSTLfunction unlock_shared
    " syntax keyword cppSTLfunction try_lock_shared
    " syntax keyword cppSTLfunction try_lock_shared_for
    " syntax keyword cppSTLfunction try_lock_shared_until

    " string {{{2
    syntax keyword cppSTLnamespace string_literals

    " tuple {{{2
    syntax keyword cppSTLtype tuple_element_t

    " type_traits {{{2
    syntax keyword cppSTLtype is_null_pointer
    syntax keyword cppSTLtype remove_cv_t
    syntax keyword cppSTLtype remove_const_t
    syntax keyword cppSTLtype remove_volatile_t
    syntax keyword cppSTLtype add_cv_t
    syntax keyword cppSTLtype add_const_t
    syntax keyword cppSTLtype add_volatile_t
    syntax keyword cppSTLtype remove_reference_t
    syntax keyword cppSTLtype add_lvalue_reference_t
    syntax keyword cppSTLtype add_rvalue_reference_t
    syntax keyword cppSTLtype remove_pointer_t
    syntax keyword cppSTLtype add_pointer_t
    syntax keyword cppSTLtype make_signed_t
    syntax keyword cppSTLtype make_unsigned_t
    syntax keyword cppSTLtype remove_extent_t
    syntax keyword cppSTLtype remove_all_extents_t
    syntax keyword cppSTLtype aligned_storage_t
    syntax keyword cppSTLtype aligned_union_t
    syntax keyword cppSTLtype decay_t
    syntax keyword cppSTLtype enable_if_t
    syntax keyword cppSTLtype conditional_t
    syntax keyword cppSTLtype common_type_t
    syntax keyword cppSTLtype underlying_type_t
    syntax keyword cppSTLtype result_of_t
    " }}}
endif " C++14


" C++17 extensions {{{1

if !exists('cpp_no_cpp17')
    " syntax keyword cppSTLfunction data

    " algorithm {{{2
    " syntax keyword cppSTLfunction clamp
    " syntax keyword cppSTLfunction for_each_n

    " any {{{2
    syntax keyword cppSTLtype any
    syntax keyword cppSTLexception bad_any_cast
    syntax keyword cppSTLcast any_cast
    " syntax keyword cppSTLfunction any_cast
    " syntax keyword cppSTLfunction make_any

    " array {{{2
    " syntax keyword cppSTLfunction to_array
    " syntax keyword cppSTLfunction make_array

    " atomic {{{2
    syntax keyword cppSTLconstant is_always_lock_free

    " chrono {{{2
    syntax keyword cppSTLbool treat_as_floating_point_v

    " cmath {{{2
    " syntax keyword cppSTLfunction assoc_laguerre assoc_laguerref assoc_laguerrel
    " syntax keyword cppSTLfunction assoc_legendre assoc_legendref assoc_legendrel
    " syntax keyword cppSTLfunction beta betaf betal
    " syntax keyword cppSTLfunction comp_ellint_1 comp_ellint_1f comp_ellint_1l
    " syntax keyword cppSTLfunction comp_ellint_2 comp_ellint_2f comp_ellint_2l
    " syntax keyword cppSTLfunction comp_ellint_3 comp_ellint_3f comp_ellint_3l
    " syntax keyword cppSTLfunction cyl_bessel_i cyl_bessel_if cyl_bessel_il
    " syntax keyword cppSTLfunction cyl_bessel_j cyl_bessel_jf cyl_bessel_jl
    " syntax keyword cppSTLfunction cyl_bessel_k cyl_bessel_kf cyl_bessel_kl
    " syntax keyword cppSTLfunction cyl_neumann cyl_neumannf cyl_neumannl
    " syntax keyword cppSTLfunction ellint_1 ellint_1f ellint_1l
    " syntax keyword cppSTLfunction ellint_2 ellint_2f ellint_2l
    " syntax keyword cppSTLfunction ellint_3 ellint_3f ellint_3l
    " syntax keyword cppSTLfunction expint expintf expintl
    " syntax keyword cppSTLfunction hermite hermitef hermitel
    " syntax keyword cppSTLfunction legendre legendrefl egendrel
    " syntax keyword cppSTLfunction laguerre laguerref laguerrel
    " syntax keyword cppSTLfunction riemann_zeta riemann_zetaf riemann_zetal
    " syntax keyword cppSTLfunction sph_bessel sph_besself sph_bessell
    " syntax keyword cppSTLfunction sph_legendre sph_legendref sph_legendrel
    " syntax keyword cppSTLfunction sph_neumann sph_neumannf sph_neumannl

    " cstdlib {{{2
    " syntax keyword cppSTLfunction aligned_alloc

    " exception {{{2
    " syntax keyword cppSTLfunction uncaught_exceptions

    " execution {{{2
    syntax keyword cppSTLnamespace execution
    syntax keyword cppSTLconstant seq par par_unseq
    syntax keyword cppSTLbool is_execution_policy_v
    syntax keyword cppSTLtype sequenced_policy
    syntax keyword cppSTLtype parallel_policy
    syntax keyword cppSTLtype parallel_unsequenced_policy
    syntax keyword cppSTLtype is_execution_policy

    " filesystem {{{2
    syntax keyword cppSTLnamespace filesystem
    syntax keyword cppSTLexception filesystem_error
    syntax keyword cppSTLtype path
    syntax keyword cppSTLtype directory_entry
    syntax keyword cppSTLtype directory_iterator
    syntax keyword cppSTLtype recursive_directory_iterator
    syntax keyword cppSTLtype file_status
    syntax keyword cppSTLtype space_info
    syntax keyword cppSTLtype file_time_type
    syntax keyword cppSTLenum file_type
    syntax keyword cppSTLenum perms
    syntax keyword cppSTLenum perm_options
    syntax keyword cppSTLenum copy_options
    syntax keyword cppSTLenum directory_options
    syntax keyword cppSTLenum format
    syntax keyword cppSTLconstant native_format generic_format auto_format
    syntax keyword cppSTLconstant preferred_separator
    syntax keyword cppSTLconstant skip_existing
    syntax keyword cppSTLconstant overwrite_existing
    syntax keyword cppSTLconstant update_existing
    syntax keyword cppSTLconstant recursive
    syntax keyword cppSTLconstant copy_symlinks
    syntax keyword cppSTLconstant skip_symlinks
    syntax keyword cppSTLconstant directories_only
    syntax keyword cppSTLconstant create_symlinks
    syntax keyword cppSTLconstant create_hard_links
    syntax keyword cppSTLconstant owner_read owner_write owner_exec owner_all
    syntax keyword cppSTLconstant group_read group_write group_exec group_all
    syntax keyword cppSTLconstant others_read others_write others_exec others_all
    syntax keyword cppSTLconstant set_uid set_gid sticky_bit
    syntax keyword cppSTLconstant follow_directory_symlink skip_permission_denied
    " Note: following keywords are very likely to coincide with some user-defined variables
    " syntax keyword cppSTLconstant all mask unknown
    " syntax keyword cppSTLconstant replace add remove nofollow
    " syntax keyword cppSTLconstant none
    " syntax keyword cppSTLconstant not_found
    " syntax keyword cppSTLconstant regular
    " syntax keyword cppSTLconstant directory
    " syntax keyword cppSTLconstant symlink
    " syntax keyword cppSTLconstant block
    " syntax keyword cppSTLconstant character
    " syntax keyword cppSTLconstant fifo
    " syntax keyword cppSTLconstant socket
    " syntax keyword cppSTLconstant unknown

    " Note: 'capacity' and 'free' are already set as cppSTLfunction
    " syntax keyword cppSTLconstant capacity
    " syntax keyword cppSTLconstant free
    " syntax keyword cppSTLconstant available
    " syntax keyword cppSTLfunction concat
    " syntax keyword cppSTLfunction make_preferred
    " syntax keyword cppSTLfunction remove_filename
    " syntax keyword cppSTLfunction replace_filename
    " syntax keyword cppSTLfunction replace_extension
    " syntax keyword cppSTLfunction native
    " syntax keyword cppSTLfunction string_type
    " Note: wstring, u8string, u16string, u32string already set as cppSTLtype
    " syntax keyword cppSTLfunction wstring
    " syntax keyword cppSTLfunction u8string
    " syntax keyword cppSTLfunction u16string
    " syntax keyword cppSTLfunction u32string
    " syntax keyword cppSTLfunction generic_string
    " syntax keyword cppSTLfunction generic_wstring
    " syntax keyword cppSTLfunction generic_u8string
    " syntax keyword cppSTLfunction generic_u16string
    " syntax keyword cppSTLfunction generic_u32string
    " syntax keyword cppSTLfunction lexically_normal
    " syntax keyword cppSTLfunction lexically_relative
    " syntax keyword cppSTLfunction lexically_proximate
    " syntax keyword cppSTLfunction root_name
    " syntax keyword cppSTLfunction root_directory
    " syntax keyword cppSTLfunction root_path
    " syntax keyword cppSTLfunction relative_path
    " syntax keyword cppSTLfunction parent_path
    " syntax keyword cppSTLfunction filename
    " syntax keyword cppSTLfunction stem
    " syntax keyword cppSTLfunction extension
    " syntax keyword cppSTLfunction has_root_name
    " syntax keyword cppSTLfunction has_root_directory
    " syntax keyword cppSTLfunction has_root_path
    " syntax keyword cppSTLfunction has_relative_path
    " syntax keyword cppSTLfunction has_parent_path
    " syntax keyword cppSTLfunction has_filename
    " syntax keyword cppSTLfunction has_stem
    " syntax keyword cppSTLfunction has_extension
    " syntax keyword cppSTLfunction is_absolute
    " syntax keyword cppSTLfunction is_relative
    " syntax keyword cppSTLfunction hash_value
    " syntax keyword cppSTLfunction u8path
    " syntax keyword cppSTLfunction path1
    " syntax keyword cppSTLfunction path2
    " syntax keyword cppSTLfunction path
    " syntax keyword cppSTLfunction status
    " syntax keyword cppSTLfunction symlink_status
    " syntax keyword cppSTLfunction options
    " syntax keyword cppSTLfunction depth
    " syntax keyword cppSTLfunction recursive_pending
    " syntax keyword cppSTLfunction disable_recursive_pending
    " syntax keyword cppSTLfunction type
    " syntax keyword cppSTLfunction permissions
    " syntax keyword cppSTLfunction absolute
    " syntax keyword cppSTLfunction system_complete
    " syntax keyword cppSTLfunction canonical
    " syntax keyword cppSTLfunction weakly_canonical
    " syntax keyword cppSTLfunction relative
    " syntax keyword cppSTLfunction proximate
    " syntax keyword cppSTLfunction copy_file
    " syntax keyword cppSTLfunction copy_symlink
    " syntax keyword cppSTLfunction create_directory
    " syntax keyword cppSTLfunction create_directories
    " syntax keyword cppSTLfunction create_hard_link
    " syntax keyword cppSTLfunction create_symlink
    " syntax keyword cppSTLfunction create_directory_symlink
    " syntax keyword cppSTLfunction current_path
    " syntax keyword cppSTLfunction exists
    " syntax keyword cppSTLfunction file_size
    " syntax keyword cppSTLfunction hard_link_count
    " syntax keyword cppSTLfunction last_write_time
    " syntax keyword cppSTLfunction read_symlink
    " syntax keyword cppSTLfunction remove_all
    " syntax keyword cppSTLfunction resize_file
    " syntax keyword cppSTLfunction space
    " syntax keyword cppSTLfunction temp_directory_path
    " syntax keyword cppSTLfunction is_block_file
    " syntax keyword cppSTLfunction is_character_file
    " syntax keyword cppSTLfunction is_directory
    " syntax keyword cppSTLfunction is_fifo
    " syntax keyword cppSTLfunction is_other
    " syntax keyword cppSTLfunction is_regular_file
    " syntax keyword cppSTLfunction is_socket
    " syntax keyword cppSTLfunction is_symlink
    " syntax keyword cppSTLfunction status_known
    " Note: 'is_empty' already set as cppSTLtype
    " syntax keyword cppSTLfunction is_empty

    " functional {{{2
    syntax keyword cppSTLtype default_order
    syntax keyword cppSTLtype default_order_t
    syntax keyword cppSTLtype default_searcher
    syntax keyword cppSTLtype boyer_moore_searcher
    syntax keyword cppSTLtype boyer_moore_horspool_searcher
    syntax keyword cppSTLbool is_bind_expression_v
    syntax keyword cppSTLbool is_placeholder_v
    " syntax keyword cppSTLfunction not_fn
    " syntax keyword cppSTLfunction make_default_searcher
    " syntax keyword cppSTLfunction make_boyer_moore_searcher
    " syntax keyword cppSTLfunction make_boyer_moore_horspool_searcher
    " syntax keyword cppSTLfunction invoke

    " memory {{{2
    syntax keyword cppSTLcast reinterpret_pointer_cast
    syntax keyword cppSTLconstant uses_allocator_v
    " syntax keyword cppSTLfunction uninitialized_move
    " syntax keyword cppSTLfunction uninitialized_move_n
    " syntax keyword cppSTLfunction uninitialized_default_construct
    " syntax keyword cppSTLfunction uninitialized_default_construct_n
    " syntax keyword cppSTLfunction uninitialized_value_construct
    " syntax keyword cppSTLfunction uninitialized_value_construct_n
    " syntax keyword cppSTLfunction destroy_at
    " syntax keyword cppSTLfunction destroy_n

    " memory_resource {{{2
    syntax keyword cppSTLtype polymorphic_allocator
    syntax keyword cppSTLtype memory_resource
    syntax keyword cppSTLtype synchronized_pool_resource
    syntax keyword cppSTLtype unsynchronized_pool_resource
    syntax keyword cppSTLtype pool_options
    syntax keyword cppSTLtype monotonic_buffer_resource
    " syntax keyword cppSTLfunction upstream_resource
    " syntax keyword cppSTLfunction get_default_resource
    " syntax keyword cppSTLfunction new_default_resource
    " syntax keyword cppSTLfunction set_default_resource
    " syntax keyword cppSTLfunction null_memory_resource
    " syntax keyword cppSTLfunction allocate
    " syntax keyword cppSTLfunction deallocate
    " syntax keyword cppSTLfunction construct
    " syntax keyword cppSTLfunction destruct
    " syntax keyword cppSTLfunction resource
    " syntax keyword cppSTLfunction select_on_container_copy_construction
    " syntax keyword cppSTLfunction do_allocate
    " syntax keyword cppSTLfunction do_deallocate
    " syntax keyword cppSTLfunction do_is_equal

    " mutex {{{2
    syntax keyword cppSTLtype scoped_lock

    " new {{{2
    syntax keyword cppSTLconstant hardware_destructive_interference_size
    syntax keyword cppSTLconstant hardware_constructive_interference_size
    " syntax keyword cppSTLfunction launder

    " numeric {{{2
    " syntax keyword cppSTLfunction gcd
    " syntax keyword cppSTLfunction lcm
    " syntax keyword cppSTLfunction exclusive_scan
    " syntax keyword cppSTLfunction inclusive_scan
    " syntax keyword cppSTLfunction transform_reduce
    " syntax keyword cppSTLfunction transform_exclusive_scan
    " syntax keyword cppSTLfunction transform_inclusive_scan
    " syntax keyword cppSTLfunction reduce

    " optional {{{2
    syntax keyword cppSTLtype optional
    syntax keyword cppSTLtype nullopt_t
    syntax keyword cppSTLexception bad_optional_access
    syntax keyword cppSTLconstant nullopt
    syntax keyword cppSTLfunction make_optional
    " syntax keyword cppSTLfunction value_or
    " syntax keyword cppSTLfunction has_value
    " syntax keyword cppSTLfunction value

    " shared_mutex {{{2
    syntax keyword cppSTLtype shared_mutex

    " string_view {{{2
    syntax keyword cppSTLtype basic_string_view
    syntax keyword cppSTLtype string_view
    syntax keyword cppSTLtype wstring_view
    syntax keyword cppSTLtype u16string_view
    syntax keyword cppSTLtype u32string_view
    " syntax keyword cppSTLfunction remove_prefix
    " syntax keyword cppSTLfunction remove_suffix

    " system_error {{{2
    syntax keyword cppSTLbool is_error_code_enum_v
    syntax keyword cppSTLbool is_error_condition_enum_v

    " tuple {{{2
    syntax keyword cppSTLconstant tuple_size_v
    syntax keyword cppSTLfunction make_from_tuple
    " syntax keyword cppSTLfunction apply

    " type_traits {{{2
    syntax keyword cppSTLbool is_void_v
    syntax keyword cppSTLbool is_null_pointer_v
    syntax keyword cppSTLbool is_integral_v
    syntax keyword cppSTLbool is_floating_point_v
    syntax keyword cppSTLbool is_array_v
    syntax keyword cppSTLbool is_enum_v
    syntax keyword cppSTLbool is_union_v
    syntax keyword cppSTLbool is_class_v
    syntax keyword cppSTLbool is_function_v
    syntax keyword cppSTLbool is_pointer_v
    syntax keyword cppSTLbool is_lvalue_reference_v
    syntax keyword cppSTLbool is_rvalue_reference_v
    syntax keyword cppSTLbool is_member_object_pointer_v
    syntax keyword cppSTLbool is_member_function_pointer_v
    syntax keyword cppSTLbool is_fundamental_v
    syntax keyword cppSTLbool is_arithmetic_v
    syntax keyword cppSTLbool is_scalar_v
    syntax keyword cppSTLbool is_object_v
    syntax keyword cppSTLbool is_compound_v
    syntax keyword cppSTLbool is_reference_v
    syntax keyword cppSTLbool is_member_pointer_v
    syntax keyword cppSTLbool is_const_v
    syntax keyword cppSTLbool is_volatile_v
    syntax keyword cppSTLbool is_trivial_v
    syntax keyword cppSTLbool is_trivially_copyable_v
    syntax keyword cppSTLbool is_standard_layout_v
    syntax keyword cppSTLbool is_pod_v
    syntax keyword cppSTLbool is_literal_type_v
    syntax keyword cppSTLbool is_empty_v
    syntax keyword cppSTLbool is_polymorphic_v
    syntax keyword cppSTLbool is_abstract_v
    syntax keyword cppSTLbool is_signed_v
    syntax keyword cppSTLbool is_unsigned_v
    syntax keyword cppSTLbool is_constructible_v
    syntax keyword cppSTLbool is_trivially_constructible_v
    syntax keyword cppSTLbool is_nothrow_constructible_v
    syntax keyword cppSTLbool is_default_constructible_v
    syntax keyword cppSTLbool is_trivially_default_constructible_v
    syntax keyword cppSTLbool is_nothrow_default_constructible_v
    syntax keyword cppSTLbool is_copy_constructible_v
    syntax keyword cppSTLbool is_trivially_copy_constructible_v
    syntax keyword cppSTLbool is_nothrow_copy_constructible_v
    syntax keyword cppSTLbool is_move_constructible_v
    syntax keyword cppSTLbool is_trivially_move_constructible_v
    syntax keyword cppSTLbool is_nothrow_move_constructible_v
    syntax keyword cppSTLbool is_assignable_v
    syntax keyword cppSTLbool is_trivially_assignable_v
    syntax keyword cppSTLbool is_nothrow_assignable_v
    syntax keyword cppSTLbool is_copy_assignable_v
    syntax keyword cppSTLbool is_trivially_copy_assignable_v
    syntax keyword cppSTLbool is_nothrow_copy_assignable_v
    syntax keyword cppSTLbool is_move_assignable_v
    syntax keyword cppSTLbool is_trivially_move_assignable_v
    syntax keyword cppSTLbool is_nothrow_move_assignable_v
    syntax keyword cppSTLbool is_destructible_v
    syntax keyword cppSTLbool is_trivially_destructible_v
    syntax keyword cppSTLbool is_nothrow_destructible_v
    syntax keyword cppSTLbool has_virtual_destructor_v
    syntax keyword cppSTLbool is_same_v
    syntax keyword cppSTLbool is_base_of_v
    syntax keyword cppSTLbool is_convertible_v
    syntax keyword cppSTLbool is_callable_v
    syntax keyword cppSTLbool is_nowthrow_callable_v
    syntax keyword cppSTLbool conjunction_v
    syntax keyword cppSTLbool disjunction_v
    syntax keyword cppSTLbool negation_v
    syntax keyword cppSTLbool has_unique_object_representations_v
    syntax keyword cppSTLbool is_swappable_v
    syntax keyword cppSTLbool is_swappable_with_v
    syntax keyword cppSTLbool is_nothrow_swappable_v
    syntax keyword cppSTLbool is_nothrow_swappable_with_v
    syntax keyword cppSTLbool is_invocable_v
    syntax keyword cppSTLbool is_invocable_r_v
    syntax keyword cppSTLbool is_nothrow_invocable_v
    syntax keyword cppSTLbool is_nothrow_invocable_r_v
    syntax keyword cppSTLbool is_aggregate_v
    syntax keyword cppSTLconstant alignment_of_v
    syntax keyword cppSTLconstant rank_v
    syntax keyword cppSTLconstant extent_v
    syntax keyword cppSTLtype bool_constant
    syntax keyword cppSTLtype is_callable
    syntax keyword cppSTLtype is_nowthrow_callable
    syntax keyword cppSTLtype conjunction
    syntax keyword cppSTLtype disjunction
    syntax keyword cppSTLtype negation
    syntax keyword cppSTLtype void_t
    syntax keyword cppSTLtype has_unique_object_representations
    syntax keyword cppSTLtype is_swappable
    syntax keyword cppSTLtype is_swappable_with
    syntax keyword cppSTLtype is_nothrow_swappable
    syntax keyword cppSTLtype is_nothrow_swappable_with
    syntax keyword cppSTLtype is_invocable
    syntax keyword cppSTLtype is_invocable_r
    syntax keyword cppSTLtype is_nothrow_invocable
    syntax keyword cppSTLtype is_nothrow_invocable_r
    syntax keyword cppSTLtype invoke_result
    syntax keyword cppSTLtype invoke_result_t
    syntax keyword cppSTLtype is_aggregate

    " unordered_map, unordered_set, unordered_multimap, unordered_multiset {{{2
    syntax keyword cppSTLtype node_type
    syntax keyword cppSTLtype insert_return_type
    " syntax keyword cppSTLfunction try_emplace
    " syntax keyword cppSTLfunction insert_or_assign
    " syntax keyword cppSTLfunction extract

    " utility {{{2
    syntax keyword cppSTLtype in_place_tag
    syntax keyword cppSTLtype in_place_t
    syntax keyword cppSTLtype in_place_type_t
    syntax keyword cppSTLtype in_place_index_t
    " syntax keyword cppSTLfunction in_place
    " syntax keyword cppSTLfunction as_const

    " variant {{{2
    syntax keyword cppSTLtype variant
    syntax keyword cppSTLtype monostate
    syntax keyword cppSTLtype variant_size
    syntax keyword cppSTLtype variant_alternative
    syntax keyword cppSTLtype variant_alternative_t
    syntax keyword cppSTLconstant variant_size_v
    syntax keyword cppSTLconstant variant_npos
    syntax keyword cppSTLexception bad_variant_access
    " syntax keyword cppSTLfunction valueless_by_exception
    " syntax keyword cppSTLfunction holds_alternative
    " syntax keyword cppSTLfunction get_if
    " syntax keyword cppSTLfunction index
    " syntax keyword cppSTLfunction visit
    " }}}
endif " C++17


" C++20 extensions {{{1

if !exists('cpp_no_cpp20')
    " memory {{{2
    syntax keyword cppSTLfunction make_unique_default_init make_shared_default_init
    syntax keyword cppSTLfunction allocate_shared_default_init
    syntax keyword cppSTLfunction uses_allocator_construction_args
    syntax keyword cppSTLfunction make_obj_using_allocator
    " syntax keyword cppSTLfunction uninitialized_construct_using_allocator
    " syntax keyword cppSTLfunction to_address

    " type_traits {{{2
    syntax keyword cppSTLtype remove_cvref remove_cvref_t
    syntax keyword cppSTLtype is_nothrow_convertible
    syntax keyword cppSTLbool is_nothrow_convertible_v
    " syntax keyword cppSTLtype endian

    " atomic {{{2
    syntax keyword cppSTLtype atomic_ref

    " compare {{{2
    syntax keyword cppSTLtype weak_ordering strong_ordering partial_ordering
    syntax keyword cppSTLtype weak_equality strong_equality
    syntax keyword cppSTLtype common_comparison_category common_comparison_category_t
    " syntax keyword cppSTLfunction is_eq is_neq is_lt is_gt is_lteq is_gteq
    " syntax keyword cppSTLfunction strong_order weak_order partial_order
    " syntax keyword cppSTLfunction strong_equal weak_equal

    " concepts {{{2
    " From: https://en.cppreference.com/w/cpp/concepts
    syntax keyword cppStatement concept requires
    syntax keyword cppSTLconcept Same
    syntax keyword cppSTLconcept DerivedFrom
    syntax keyword cppSTLconcept ConvertibleTo
    syntax keyword cppSTLconcept CommonReference
    syntax keyword cppSTLconcept Common
    syntax keyword cppSTLconcept Integral
    syntax keyword cppSTLconcept SignedIntegral
    syntax keyword cppSTLconcept UnsignedIntegral
    syntax keyword cppSTLconcept Assignable
    syntax keyword cppSTLconcept Swappable
    syntax keyword cppSTLconcept SwappableWith
    syntax keyword cppSTLconcept Destructible
    syntax keyword cppSTLconcept Constructible
    syntax keyword cppSTLconcept DefaultConstructible
    syntax keyword cppSTLconcept MoveConstructible
    syntax keyword cppSTLconcept CopyConstructible
    syntax keyword cppSTLconcept Boolean
    syntax keyword cppSTLconcept EqualityComparable
    syntax keyword cppSTLconcept EqualityComparableWith
    syntax keyword cppSTLconcept StrictTotallyOrdered
    syntax keyword cppSTLconcept StrictTotallyOrderedWith
    syntax keyword cppSTLconcept Movable
    syntax keyword cppSTLconcept Copyable
    syntax keyword cppSTLconcept Semiregular
    syntax keyword cppSTLconcept Regular
    syntax keyword cppSTLconcept Invocable
    syntax keyword cppSTLconcept RegularInvocable
    syntax keyword cppSTLconcept Predicate
    syntax keyword cppSTLconcept Relation
    syntax keyword cppSTLconcept StrictWeakOrder

    " concepts - named requirements {{{2
    " Those are concepts that haven't made it into the C++ standard yet
    " https://en.cppreference.com/w/cpp/named_req
    " http://en.cppreference.com/w/cpp/language/constraints
    if exists('g:cpp_named_requirements_highlight') && g:cpp_named_requirements_highlight
        syntax keyword cppSTLNamedReq MoveAssignable
        syntax keyword cppSTLNamedReq CopyAssignable
        syntax keyword cppSTLNamedReq TriviallyCopyable
        syntax keyword cppSTLNamedReq TrivialType
        syntax keyword cppSTLNamedReq StandardLayoutType
        syntax keyword cppSTLNamedReq PODType
        syntax keyword cppSTLNamedReq LessThanComparable
        syntax keyword cppSTLNamedReq ValueSwappable
        syntax keyword cppSTLNamedReq NullablePointer
        syntax keyword cppSTLNamedReq Hash
        syntax keyword cppSTLNamedReq Allocator
        syntax keyword cppSTLNamedReq FunctionObject
        syntax keyword cppSTLNamedReq Callable
        syntax keyword cppSTLNamedReq BinaryPredicate
        syntax keyword cppSTLNamedReq Compare
        syntax keyword cppSTLNamedReq Container
        syntax keyword cppSTLNamedReq ReversibleContainer
        syntax keyword cppSTLNamedReq AllocatorAwareContainer
        syntax keyword cppSTLNamedReq SequenceContainer
        syntax keyword cppSTLNamedReq ContiguousContainer
        syntax keyword cppSTLNamedReq AssociativeContainer
        syntax keyword cppSTLNamedReq UnorderedAssociativeContainer
        syntax keyword cppSTLNamedReq DefaultInsertable
        syntax keyword cppSTLNamedReq CopyInsertable
        syntax keyword cppSTLNamedReq CopyInsertable
        syntax keyword cppSTLNamedReq MoveInsertable
        syntax keyword cppSTLNamedReq EmplaceConstructible
        syntax keyword cppSTLNamedReq Erasable
        syntax keyword cppSTLNamedReq Iterator
        syntax keyword cppSTLNamedReq InputIterator
        syntax keyword cppSTLNamedReq OutputIterator
        syntax keyword cppSTLNamedReq ForwardIterator
        syntax keyword cppSTLNamedReq BidirectionalIterator
        syntax keyword cppSTLNamedReq RandomAccessIterator
        syntax keyword cppSTLNamedReq ContiguousIterator
        syntax keyword cppSTLNamedReq UnformattedInputFunction
        syntax keyword cppSTLNamedReq FormattedInputFunction
        syntax keyword cppSTLNamedReq UnformattedOutputFunction
        syntax keyword cppSTLNamedReq FormattedOutputFunction
        syntax keyword cppSTLNamedReq SeedSequence
        syntax keyword cppSTLNamedReq UniformRandomBitGenerator
        syntax keyword cppSTLNamedReq RandomNumberEngine
        syntax keyword cppSTLNamedReq RandomNumberEngineAdaptor
        syntax keyword cppSTLNamedReq RandomNumberDistribution
        syntax keyword cppSTLNamedReq BasicLockable
        syntax keyword cppSTLNamedReq Lockable
        syntax keyword cppSTLNamedReq TimedLockable
        syntax keyword cppSTLNamedReq Mutex
        syntax keyword cppSTLNamedReq TimedMutex
        syntax keyword cppSTLNamedReq SharedMutex
        syntax keyword cppSTLNamedReq SharedTimedMutex
        syntax keyword cppSTLNamedReq UnaryTypeTrait
        syntax keyword cppSTLNamedReq BinaryTypeTrait
        syntax keyword cppSTLNamedReq TransformationTrait
        syntax keyword cppSTLNamedReq Clock
        syntax keyword cppSTLNamedReq TrivialClock
        syntax keyword cppSTLNamedReq CharTraits
        syntax keyword cppSTLNamedReq BitmaskType
        syntax keyword cppSTLNamedReq NumericType
        syntax keyword cppSTLNamedReq RegexTraits
        syntax keyword cppSTLNamedReq LiteralType
        hi def link cppSTLNamedReq Typedef
    endif " C++ named requirements

    " contract {{{2
    syntax keyword cppSTLtype contract_violation

    " syncstream {{{2
    syntax keyword cppSTLtype basic_syncbuf basic_osyncstream
    syntax keyword cppSTLtype syncbuf wsyncbuf osyncstream wosyncstream
    " }}}
endif


" Boost extensions {{{1
if !exists('cpp_no_boost')
    syntax keyword cppSTLnamespace boost
    syntax keyword cppSTLcast lexical_cast
endif


" Default highlighting {{{1
hi def link cppSTLbool         Boolean
hi def link cppStatement       Statement
hi def link cppSTLfunction     Function
hi def link cppSTLfunctional   Typedef
hi def link cppSTLconstant     Constant
hi def link cppSTLnamespace    Constant
hi def link cppSTLtype         Typedef
hi def link cppSTLexception    Exception
hi def link cppSTLiterator     Typedef
hi def link cppSTLiterator_tag Typedef
hi def link cppSTLenum         Typedef
hi def link cppSTLios          Function
hi def link cppSTLcast         Statement
hi def link cppRawString       String
hi def link cppRawDelimiter    Delimiter
hi def link cppSTLconcept      Typedef
hi def link cppSTLVariable     Identifier

" I don't like the way the keywords {inline, virtual, explicit, export,
" override, final} are highlighted with the default syntax file (by default they
" are highlighted as Type). Let's link them to a different highlighting group
hi! link cppModifier StorageClass

" Optional highlighting {{{1

" Highlight all standard C++ keywords as Statement
" This is very similar to what IDEs and other editors do
if exists('g:cpp_simple_highlight') && g:cpp_simple_highlight
    hi! link cppModifier     Statement
    hi! link cppStructure    Statement
    hi! link cppExceptions   Statement
    hi! link cppStorageClass Statement
    hi! link cppSTLexception Typedef
endif
